iT邦幫忙

5

[EMACS新思維 第三天] 關於包管理:el-get [上]

  • 分享至 

  • xImage
  •  

強大更勝 vundle 的 el-get 介紹之上篇。
本篇要介紹複雜許多,功能也強大很多的el-get: [上篇]

el-get.el是相對於package.el的另一個套件。與package不同的是,他沒有一個集中的套件管理中心,而是讓使用者自行從svn、git、hg、Google-code、emacswiki,當然還有剛剛提到的各elpa庫裏面安裝套件。

首先透過網路執行安裝 elisp 程式(其實有點安全性上的問題?因為 emacs 其實可以更動你所有 home 下面的檔案)

將安裝代碼貼到 *scrath* 按下 C-x C-e 讓他執行

(url-retrieve
 "https://raw.github.com/dimitri/el-get/master/el-get-install.el"
 (lambda (s)
   (let (el-get-master-branch)
     (goto-char (point-max))
     (eval-print-last-sexp))))

在.emacs.d中,就會建立起一個el-get的資料夾。裏面包含了el-get的主程式以及使用者選定安裝的套件。必須在 init.el 或 .emacs 中宣告el-get所在資料夾的位置,才不會導致require錯誤!(底下所付,為一安全防護措施,稍候解釋,關鍵是add-to-list那句話一定要出現,不然會導致錯誤)

el-get 載入代碼:(放置於 init.el 開頭)

(add-to-list 'load-path "~/.emacs.d/el-get/el-get")
(unless (require 'el-get nil t) 
  (url-retrieve
   "https://github.com/dimitri/el-get/raw/master/el-get-install.el" 
   (lambda (s) (end-of-buffer) (eval-print-last-sexp))))

經過此番步驟,el-get 的環境已經基本建立起來了。接下來說明一點 el-get 的特色:

  1. 管理各種來源的第三方擴展(安裝、升級、移除)
  2. 支持安裝後的各種設定,以及 hook
  3. 支持擴展包 man/info 的安裝,裝好後,可用 C-h i 察看套件資料
  4. 源描述文件撰寫方式簡易,可以從其他非官方源捉取套件(cvs、svn、git等各種版本管理伺服,不過除了git之外,都必須另外撰寫elisp操作)
  5. 支持異步/同步安裝,請見後面說明
  6. 支持 ELPA 的各種套件安裝

注意,是el-get-sources,複數的,我搞了很久才注意到這個重點!難怪怎麼都沒辦法自動同步,原來就是這個原因阿!

另外,這個setq只是自訂「使用者自己的recipe」,真正執行安裝包的不是這個動作。

「食譜」代碼編寫:

(setq
 el-get-sources
 '(el-get
   (:name smex
          :after (progn ;; 這邊就是對套件進行載入後設定,以及撰寫 recipe
                   (global-set-key (kbd "M-x") 'smex)
                   (global-set-key (kbd "M-X") 'smex-major-mode-commands)))
   (:name magit
      :after (global-set-key (kbd "C-x C-z") 'magit-status))))

;; 設定要安裝的包!這裡是重點,下面解釋:
(setq packages
      (append
       '(el-get smex magit
                paredit python-mode web-mode go-mode)
       (mapcar 'el-get-source-name el-get-sources)))

;; 這裡是設定重點,包含異步/同步啟動機制
(el-get 'sync packages)

必須在這邊指定要安裝哪些包。上面的 el-get-source 只是使用者自訂recipe而已。官方提供的 recipe 可以到 /.emacs.d/el-get/el-get/recipe 裏面看。

這邊是初始化代碼,裏面可以有來自各種官方來源的包,也可以是使用者自行設定的包,也就是所謂的 recipe,請看下面 Recipe 代碼例子

Recipe代碼:

(:name el-get
       :type git
       :url "git://github.com/dimitri/el-get.git"
       :features el-get
       :compile "el-get.el")

可以指定特殊來源(只有 git 內建支援,其他參見 emacswiki)。使用者本身設定完之後,接著即進行載入的動作(el-get)。需要注意的是,如果套件之間有互相依賴的關係,先載入依賴方,可能就會導致過程錯誤,使 emacs 的載入過程停頓。所以若套件之間有相互依賴的關係,需要把被依賴的套件放在文件前端,然後使用異步載入指令(el-git ‘sync)來達成相依性的問題。

另外,通過執行 M-x el-get-emacswiki-refresh,可以獲得來自emacswiki上面的套件列表,再透過el-get-install安裝這些套件。(因此你不能把來自 emacswiki 的 el 寫在前面的初始化設定內,除非你在更前面放了 wiki-refresh 的命令,但此命令卻會讓你每次啟動都會 refresh 一次。)

el-get 最為人所稱到的是,假如你在一台全新的電腦上面貼上你的 init.el/.emacs,卻沒有安裝這些套件,el-get 會根據你的設定以及 recipe,去抓取正確、最新的套件到資料夾中,免去了要重新安裝的煩惱。這也是我前面那邊說,安裝代碼需要有個安全防護措施的原因:要先安裝 el-get,才有之後的步驟呀!


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

我要留言

立即登入留言